"""
爬虫系统主程序
负责程序的启动、运行和数据保存
"""

import logging
from crawler.spider import MultiPlatformSpider
import pandas as pd
from config.config import DB_CONFIG, CRAWLER_CONFIG
import os

# 配置日志系统
logging.basicConfig(
    level=logging.INFO,  # 设置日志级别
    format='%(asctime)s - %(levelname)s - %(message)s',  # 设置日志格式
    handlers=[
        logging.FileHandler('crawler.log', encoding='utf-8'),  # 文件处理器
        logging.StreamHandler()  # 控制台处理器
    ]
)

def setup_data_dir():
    """
    确保数据存储目录存在
    
    Notes:
        - 检查配置文件中指定的数据目录
        - 如果目录不存在则创建
    """
    data_dir = os.path.dirname(DB_CONFIG['csv_path'])
    if not os.path.exists(data_dir):
        os.makedirs(data_dir)

def save_to_csv(jobs):
    """
    将爬取的职位信息保存到CSV文件
    
    Args:
        jobs: 职位信息列表
        
    Notes:
        - 使用pandas DataFrame处理数据
        - 保存为UTF-8编码的CSV文件
        - 记录保存结果到日志
    """
    if not jobs:
        logging.warning("没有找到符合条件的职位信息")
        return
        
    df = pd.DataFrame([job.to_dict() for job in jobs])
    df.to_csv(DB_CONFIG['csv_path'], index=False, encoding='utf-8-sig')
    logging.info(f"成功保存{len(jobs)}条职位信息到 {DB_CONFIG['csv_path']}")

def main():
    """
    主程序入口
    
    流程：
        1. 创建数据目录
        2. 初始化多平台爬虫
        3. 爬取所有平台
        4. 解析职位信息
        5. 保存数据
        
    异常处理：
        - 记录所有异常到日志
        - 确保程序可以优雅退出
    """
    try:
        # 确保数据目录存在
        setup_data_dir()
        
        # 初始化多平台爬虫
        spider = MultiPlatformSpider(CRAWLER_CONFIG)
        logging.info("爬虫程序启动...")
        
        # 爬取所有平台
        jobs = spider.crawl_all()
        logging.info(f"所有平台共找到 {len(jobs)} 个符合条件的职位")
        
        # 保存数据
        save_to_csv(jobs)
        
    except Exception as e:
        logging.error(f"程序运行出错: {str(e)}")
        raise
    
if __name__ == "__main__":
    main() 